package controllers.pojo;

import java.util.ArrayList;

import models.Jogador;

public class Gerenciador {

	public int idGerenciador;
	public Partida partida;
	public ArrayList<Jogador> jogadores = new ArrayList<Jogador>();
	public ArrayList<Integer> pontosJogadores = new ArrayList<Integer>();
	public int jogadorAtual;
	public boolean jogoAtivo;

	public Gerenciador() {
	}

	public Gerenciador(int idGerenciador, Partida partida, Jogador jogador1,
			Jogador jogador2) {
		this.idGerenciador = idGerenciador;
		this.partida = partida;
		jogadores.add(jogador1);
		jogadores.add(jogador2);
		pontosJogadores.add(0);
		pontosJogadores.add(0);
		jogadorAtual = 0;
		jogoAtivo = true;
	}

	public Jogador mudarJogador() {
		jogadorAtual = (jogadorAtual + 1) % 2;
		return jogadorAtual();
	}

	public Jogador jogadorAtual() {
		return jogadores.get(jogadorAtual);
	}

	public void efetuarJogada(int altura, int largura, Jogador jogador) {
		int pontosJogada = 0;

		if (partida.jogadaValida(altura, largura)) {
			pontosJogada += partida
					.efetuarJogada(altura, largura, jogador.nome);

			if (pontosJogada > 0) {

				// soma os pontos ganhos com os pontos acumulados
				int pontosAtuaisJogador = pontosJogada
						+ pontosJogadores.get(jogadorAtual);

				// atualiza os pontos acumulados
				pontosJogadores.set(jogadorAtual, pontosAtuaisJogador);
			} else {
				mudarJogador();
			}

			System.out.println(partida);
			System.out.println("Pontuação | " + jogadores.get(0).nome + ": "
					+ pontosJogadores.get(0) + " | " + jogadores.get(1).nome
					+ ": " + pontosJogadores.get(1));

			if (partida.qtdCaixasFechadas == partida.qtdCaixasTotal) {
				finalizarPartida();
			}
		}
	}

	private void finalizarPartida() {
		jogoAtivo = false;
		(new models.Partida(jogadores.get(0), jogadores.get(1),
				pontosJogadores.get(0), pontosJogadores.get(1))).save();

		Jogador jogador1 = jogadores.get(0);
		jogador1.pontuacao = jogador1.pontuacao + pontosJogadores.get(0);

		Jogador jogador2 = jogadores.get(0);
		jogador2.pontuacao = jogador2.pontuacao + pontosJogadores.get(1);

		if (pontosJogadores.get(0) > pontosJogadores.get(1)) {
			jogador1.vitorias++;
			jogador2.derrotas++;
		} else if (pontosJogadores.get(0) < pontosJogadores.get(1)) {
			jogador2.vitorias++;
			jogador1.derrotas++;
		} else {
			jogador1.empates++;
			jogador2.empates++;
		}

		jogador1.save();
		jogador2.save();
	}

	public PartidaDTO toDTO() {
		return new PartidaDTO(idGerenciador, jogadorAtual().nome,
				jogadores.get(0).nome, jogadores.get(1).nome,
				pontosJogadores.get(0), pontosJogadores.get(1), jogoAtivo,
				partida.matriz.clone());
	}
}
